﻿using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
//
using System.Runtime.InteropServices;

namespace HikPlayer
{
    #region struct
    /// <summary>
    /// 客户端的参数结构
    /// 说明：如果将m_bUserCheck置为FALSE，则把用户名和密码作为空指针发送到服务器。虽然用户名和密
    /// 码的内容不能超过50字节，但是用户名和密码缓冲区长度必须大于等于50，因为内部操作的时候直接从
    /// 用户名或密码缓冲区拷贝50字节到发送缓冲区里。 
    /// </summary>
    public struct CLIENT_VIDEOINFO
    {
        /// <summary>
        /// 对应服务端的的通道号
        /// </summary>
        public byte m_bRemoteChannel;
        /// <summary>
        /// 网络连接方式
        /// </summary>
        public byte m_bSendMode;
        /// <summary>
        /// 图像格式，0为服务端主通道的图像 ；1为服务端子通道的图像
        /// </summary>
        public byte m_nImgFormat;
        /// <summary>
        /// 服务端的IP地址
        /// </summary>
        public string m_sIPAddress;
        /// <summary>
        /// 用户名 
        /// </summary>
        public string m_sUserName;
        /// <summary>
        /// 密码 
        /// </summary>
        public string m_sUserPassword;
        /// <summary>
        /// 是否需要发送用户名和密码
        /// </summary>
        public bool m_bUserCheck;
        /// <summary>
        /// 显示区域
        /// </summary>
        public System.IntPtr m_hShowVideo;
    }
    #endregion

    #region enum
    /// <summary>
    /// 网络连接方式
    /// </summary>
    public enum SEND_MODE
    {
        /// <summary>
        /// UDP方式
        /// </summary>
        UDPMODE = 0,
        /// <summary>
        /// TCP方式
        /// </summary>
        TCPMODE,
        /// <summary>
        /// 多播方式
        /// </summary>
        MULTIMODE,
        /// <summary>
        /// 电话线方式
        /// </summary>
        DIALING,
        /// <summary>
        /// 音频流畅模式
        /// </summary>
        AUDIODETACH
    };

    /// <summary>
    /// 显示模式
    /// </summary>
    public enum DISP_MODE
    {
        /// <summary>
        /// 可以同时显示多个窗口，但对显卡有一定要求
        /// </summary>
        NORMALMODE = 0,
        /// <summary>
        /// 只能同时显示一个窗口，但是对显卡没有什么要求
        /// </summary>
        OVERLAYMODE
    };

    #endregion
    #region delegate

    /// <summary>
    /// 读实时数据回调。用于读取数据流。如果ReadDataCallBack为null，表示不需要读取数据流
    /// 
    /// Void(CALLBACK*ReadDataCallBack)(DWORD nChannel,UCHAR *pPacketBuffer,DWORD nPacketSize)); 
    /// </summary>
    /// <param name="nChannel">表示通道号</param>
    /// <param name="pPacketBuffer">数据缓存指针</param>
    /// <param name="nPacketSize">数据个数</param>
    public delegate void ReadDataCallBack(ulong nChannel, [MarshalAs(UnmanagedType.LPArray)] byte[] pPacketBuffer, ulong nPacketSize);

    /// <summary>
    /// 捕图回调
    /// 
    /// void (CALLBACK* CapPicFun)(long StockHandle, char * pBuf, long nSize, long nWidth, long nHeight, long nStamp, long nType, long nReceaved)
    /// </summary>
    /// <param name="StockHandle">MP4_ClientStart成功返回的值。</param>
    /// <param name="pBuf">返回图像数据</param>
    /// <param name="nSize">返回图像数据大小</param>
    /// <param name="nWidth">画面宽，单位像素</param>
    /// <param name="nHeight">画面高</param>
    /// <param name="nStamp">时标信息，单位毫秒</param>
    /// <param name="nType">数据类型， T_RGB32，T_UYVY详见宏定义说明。</param>
    /// <param name="nReceaved">保留</param>
    public delegate void CapPicFun(int StockHandle, IntPtr pBuf, int nSize, int nWidth, int nHeight, int nStamp, int nType, int nReceaved);

    /// <summary>
    /// 画
    /// </summary>
    public delegate void DrawFun(int StockHandle, System.Drawing.Graphics hDc, int nUser);

    #endregion


    //class HikClient
    //{
    //   }
    /// <summary>
    /// hikclient.dll   HikClient
    /// </summary> 
    #region 海康dll
  
    public class PcHikClient
    {

        public static readonly uint WM_USER = 0x0400;

        #region 客户端函数

        /// <summary>
        /// 对客户端初始化
        ///     注：在调用所有其他客户端函数之前调用。
        /// 
        /// 1.  BOOL  __stdcall MP4_ClientStartup(UINT nMessage,HWND hWnd);
        /// </summary>
        /// <param name="nMessage">表示对应接收程序的消息。</param>
        /// <param name="hWnd">表示应用程序窗口句柄。</param>
        /// <returns>返回TRUE表示成功，返回FALSE表示失败。</returns>
        [DllImport(@"\HK\hikclient.dll")]
        public static extern bool MP4_ClientStartup(uint nMessage, IntPtr hWnd);

        /// <summary>
        /// 结束调用客户端函数。
        ///     注：调用MP4_ClientCleanup()后不能再调用其他客户端函数。
        /// 
        /// 2.  BOOL  __stdcall MP4_ClientCleanup();
        /// </summary>
        /// <returns>返回TRUE表示成功，返回FALSE表示失败。</returns>
        [DllImport(@"\HK\hikclient.dll")]
        public static extern bool MP4_ClientCleanup();

        /// <summary>
        /// 启动客户端
        ///     注 ：MP4_ClientStart返回成功，并不表示已经成功连接服务端。您需要通过MP4_ClientGetState函数 
        ///     去获得网络连接的状态 
        /// 
        /// 3.  LONG __stdcall MP4_ClientStart(PCLIENT_VIDEOINFO pClientinfo, Void(CALLBACK*ReadDataCallBack)(DWORD nChannel,UCHAR *pPacketBuffer,DWORD nPacketSize));
        /// </summary>
        /// <param name="pClientinfo"></param>
        /// <param name="rdcb">用来读取数据流。如果ReadDataCallBack为NULL，表示不需要读取数据流。 </param>
        /// <returns>返回-1表示失败，其他值表示成功。作为后续操作的参数。</returns>
        [DllImport(@"\HK\hikclient.dll")]
        public static extern int MP4_ClientStart(ref CLIENT_VIDEOINFO pClientinfo, ReadDataCallBack rdcb);

        /// <summary>
        /// 停止客户端。
        /// 
        /// 4.  BOOL  __stdcall MP4_ClientStop(LONG StockHandle); 
        /// </summary>
        /// <param name="StockHandle">MP4_ClientStart成功返回的值。</param>
        /// <returns>返回TRUE表示成功，返回FALSE表示失败。</returns>
        [DllImport(@"\HK\hikclient.dll")]
        public static extern bool MP4_ClientStop(long StockHandle);

        /// <summary>
        /// 获取客户端状态
        ///     -1  :   无效
        ///     1   :   连接
        ///     2   :   开始接收图像
        ///     3   :   异常退出
        ///     4   :   接收完毕，退出
        ///     5   :   无法联系服务器
        ///     6   :   服务器拒绝访问
        /// 
        /// 5．LONG  __stdcall MP4_ClientGetState(LONG StockHandle)；
        /// </summary>
        /// <param name="StockHandle">成功返回的值</param>
        /// <returns></returns>
        [DllImport(@"\HK\hikclient.dll")]
        public static extern int MP4_ClientGetState(long StockHandle);

        /// <summary>
        /// 开始客户端的数据捕获(回调方式，使用MP4_ClientStart中的ReadDataCallBack函数)。
        /// 
        /// 6．BOOL __stdcall MP4_ClientStartCapture(LONG StockHandle);
        /// </summary>
        /// <param name="StockHandle">MP4_ClientStart成功返回的值。</param>
        /// <returns>返回TRUE表示成功，返回FALSE表示失败。</returns>
        [DllImport(@"\HK\hikclient.dll")]
        public static extern bool MP4_ClientStartCapture(long StockHandle);

        /// <summary>
        /// 开始客户端的数据捕获(直接写文件方式)。
        /// 
        /// 7．BOOL  __stdcall MP4_ClientStartCaptureFile(LONG StockHandle, LPTSTR FileName);
        /// </summary>
        /// <param name="StockHandle">MP4_ClientStart成功返回的值。</param>
        /// <param name="FileName">文件名。 </param>
        /// <returns>返回TRUE表示成功，返回FALSE表示失败。</returns>
        [DllImport(@"\HK\hikclient.dll")]
        public static extern bool MP4_ClientStartCaptureFile(int StockHandle, string FileName);

        /// <summary>
        /// 停止客户端的数据捕获。
        ///     对MP4_ClientStartCapture和MP4_ClientStartCaptureFile都有效。 
        /// 
        /// 8．BOOL __stdcall MP4_ClientStopCapture(LONG StockHandle); 
        /// </summary>
        /// <param name="StockHandle">MP4_ClientStart成功返回的值。</param>
        /// <returns>返回TRUE表示成功，返回FALSE表示失败。</returns>
        [DllImport(@"\HK\hikclient.dll")]
        public static extern bool MP4_ClientStopCapture(int StockHandle);

        /// <summary>
        /// 获取服务端的通道数。
        /// 
        /// 9．WORD  __stdcall MP4_ClientGetServerChanNum(LPCTSTR m_sIPAddress);
        /// </summary>
        /// <param name="m_sIPAddress">服务端的IP地址。</param>
        /// <returns>返回0表示失败，其他值表示通道数。</returns>
        [DllImport(@"\HK\hikclient.dll")]
        public static extern ushort MP4_ClientGetServerChanNum(string m_sIPAddress);

        /// <summary>
        /// 给服务器发送字符串
        /// 
        /// 10．BOOL  __stdcall MP4_ClientCommandtoServer(LPCTSTR m_lAddrIP, char *m_sCommand,WORD m_wLen)
        /// </summary>
        /// <param name="m_lAddrIP">服务器IP地址</param>
        /// <param name="m_sCommand">消息缓冲指针</param>
        /// <param name="m_wLen">消息缓冲长度，必须小于900个字节</param>
        /// <returns>返回0表示失败，其他值表示通道数。 </returns>
        [DllImport(@"\HK\hikclient.dll")]
        public static extern bool MP4_ClientCommandtoServer(string m_lAddrIP, string m_sCommand, ushort m_wLen);

        /// <summary>
        /// 对服务端的nChannel通道网络连接初始化，结束当前所有用户对它的访问。
        /// 
        /// 11．BOOL  __stdcall MP4_ClientShut(LPCTSTR m_lAddrIP,char nChannel);
        /// </summary>
        /// <param name="m_lAddrIP">表示服务端的IP地址。</param>
        /// <param name="cChannel">表示服务端通道号。</param>
        /// <returns>返回TRUE表示成功，返回FALSE表示失败。 </returns>
        [DllImport(@"\HK\hikclient.dll")]
        public static extern bool MP4_ClientShut(string m_lAddrIP, char cChannel);

        /// <summary>
        /// 读取服务端消息。
        ///     读取服务端MP4_ServerStringToClient函数发送过来的消息。(不超过900字节)
        /// 
        /// 12.  void  __stdcall MP4_ClientReadLastMessage(char * m_sIP ,char *m_sCommand,WORD *m_wLen); 
        /// </summary>
        /// <param name="m_sIP">消息来自哪个IP地址。</param>
        /// <param name="m_sCommand">消息缓冲区指针。 </param>
        /// <param name="m_wLen">消息缓冲区长度。</param>
        [DllImport(@"\HK\hikclient.dll")]
        public static extern void MP4_ClientReadLastMessage(string m_sIP, out string m_sCommand, out ushort m_wLen);

        /// <summary>
        /// 设置当前播放器音量。
        /// 
        /// 13．BOOL  __stdcall MP4_ClientAudioVolume(WORD wVolume); 
        /// </summary>
        /// <param name="wVolume">音量值(0-0xffff) </param>
        /// <returns>返回TRUE表示成功，返回FALSE表示失败。</returns>
        [DllImport(@"\HK\hikclient.dll")]
        public static extern bool MP4_ClientAudioVolume(ushort wVolume);

        /// <summary>
        /// 选定某个播放器播放声音，其他播放器静止。
        /// 
        /// 14.  BOOL  __stdcall MP4_ClientAudioStart(LONG StockHandle);
        /// </summary>
        /// <param name="StockHandle">MP4_ClientStart成功返回的值。</param>
        /// <returns>返回TRUE表示成功，返回FALSE表示失败。</returns>
        [DllImport(@"\HK\hikclient.dll")]
        public static extern bool MP4_ClientAudioStart(long StockHandle);

        /// <summary>
        /// 停止播放声音
        /// 
        /// 15.  BOOL  __stdcall MP4_ClientAudioStop();
        /// </summary>
        /// <returns>返回TRUE表示成功，返回FALSE表示失败。 </returns>
        [DllImport(@"\HK\hikclient.dll")]
        public static extern bool MP4_ClientAudioStop();

        /// <summary>
        /// 功能同MP4_ClientCommandtoServer，只是第一个参数使用了MP4_ClientStart成功返回的值。
        /// 
        /// 16. BOOL __stdcall MP4_ClientCommandtoServer_Handle(LONG StockHandle,char *m_sCommand, WORD m_wLen); 
        /// </summary>
        /// <param name="StockHandle"></param>
        /// <param name="m_sCommand"></param>
        /// <param name="m_wLen"></param>
        /// <returns>返回TRUE表示成功，返回FALSE表示失败。</returns>
        [DllImport(@"\HK\hikclient.dll")]
        public static extern bool MP4_ClientCommandtoServer_Handle(int StockHandle, out string m_sCommand, ushort m_wLen);

        /// <summary>
        /// 系统是否支持网络播放器(在显示模式设为NORMALMODE的情况下)。
        /// 
        /// 17．int   __stdcall MP4_ClientIsSupport(); 
        /// </summary>
        /// <returns>返回值的低8位每位表示一个信息。每一位的定义如上所示，0表示不支持，1表示支持。 
        /// 如果SUPPORT_DDRAW、SUPPORT_BLT、SUPPORT_CPU其中有一个为0，表示播放器根本无法播放； 
        /// 如果SUPPORT_BLTFOUR、SUPPORT_BLTSHRINKX、SUPPORT_BLTSHRINKY、 
        /// SUPPORT_BLTSTRETCHX、SUPPORT_BLTSTRETCHY其中有一个为0，表示播放器虽然能够播放，但
        /// 是效率很低，有可能因为CPU利用率太高而无法显示。 
        /// 播放器必须在增强色(16位)，或者真彩色(32位)模式下运行。如果出现SUPPORT_BLTFOURCC、 
        /// SUPPORT_BLTSHRINKX、SUPPORT_BLTSHRINKY、SUPPORT_BLTSTRETCHX、 
        /// SUPPORT_BLTSTRETCHY其中有一个为0，会采用软件显示方式，这时候必须在真彩色(32位)模式下才
        /// 能运行。 
        /// </returns>
        [DllImport(@"\HK\hikclient.dll")]
        public static extern int MP4_ClientIsSupport();

        /// <summary>
        /// 增加接收缓冲区大小。
        ///     说明：WBufNum值每增加1，表示接收缓冲区增加1帧的数据量。如果以5帧/秒的帧率播放，那么WbufNum=5，表示增加了5帧的缓冲区。 
        /// 
        /// 18.  BOOL  __stdcall MP4_ClientSetBufferNum(LONG StockHandle,WORD wBufNum);
        /// </summary>
        /// <param name="StockHandle">MP4_ClientStart成功返回的值。</param>
        /// <param name="wBufNum">增加缓冲区个数，0-50。</param>
        /// <returns>返回TRUE表示成功，返回FALSE表示失败。</returns>
        [DllImport(@"\HK\hikclient.dll")]
        public static extern bool MP4_ClientSetBufferNum(long StockHandle, ushort wBufNum);

        /// <summary>
        /// 设置服务端的网络端口号和客户端的网络端口号。同MP4_ServerSetNetPort
        /// 
        /// 19.  BOOL  __stdcall MP4_ClientSetNetPort(WORD dServerPort,WORD dClientPort); 
        /// </summary>
        /// <param name="dServerPort">服务端的起始网络端口号。</param>
        /// <param name="dClientPort">客户端的网络端口号。</param>
        /// <returns></returns>
        [DllImport(@"\HK\hikclient.dll")]
        public static extern bool MP4_ClientSetNetPort(ushort dServerPort, ushort dClientPort);

        /// <summary>
        /// 设置多播的TTL参数。
        /// 
        /// 20.  BOOL     __stdcall MP4_ClientSetTTL(unsigned char cTTLVal);
        /// </summary>
        /// <param name="cTTLVal">TTL值。1-255，默认32。 </param>
        /// <returns>返回TRUE表示成功，返回FALSE表示失败。</returns>
        [DllImport(@"\HK\hikclient.dll")]
        public static extern bool MP4_ClientSetTTL(char cTTLVal);

        /// <summary>
        /// 接收多少数据后才开始播放。 
        /// 
        /// 21.  BOOL  __stdcall MP4_ClientSetPlayDelay(LONG StockHandle,WORD DelayLen); 
        /// </summary>
        /// <param name="StockHandle">MP4_ClientStart成功返回的值。</param>
        /// <param name="DelayLen">预先接收的数据量。单位:K。范围：0-600</param>
        /// <returns>返回TRUE表示成功，返回FALSE表示失败。</returns>
        [DllImport(@"\HK\hikclient.dll")]
        public static extern bool MP4_ClientSetPlayDelay(long StockHandle, ushort DelayLen);

        /// <summary>
        /// 设置连接服务端的等待时间和尝试次数。参数说明同MP4_ServerSetWait。
        /// 
        /// 22.  BOOL  __stdcall MP4_ClientSetWait(DWORD dEachWaitTime,DWORD dTrynum);
        /// </summary>
        /// <param name="dEachWaitTime"></param>
        /// <param name="dTrynum"></param>
        /// <returns></returns>
        [DllImport(@"\HK\hikclient.dll")]
        public static extern bool MP4_ClientSetWait(ulong dEachWaitTime, ulong dTrynum);

        /// <summary>
        /// 设置播放器的显示模式。
        /// 
        /// 23.  BOOL  __stdcall MP4_ClientSetShowMode(DWORD dShowType,COLORREF colorKey);
        /// </summary>
        /// <param name="dShowType">显示模式。NORMALMODE或者OVERLAYMODE。</param>
        /// <param name="colorKey">用户设置的透明色，透明色相当于一层透视膜，显示的画面只能穿过这种颜色，而其他的颜色
        /// 将挡住显示的画面。用户应该在显示窗口中涂上这种颜色，那样才能看到显示画面。一般应该使用一种不
        /// 常用的颜色作为透明色。这是一个双字节值0x00rrggbb,最高字节为0，后三个字节分别表示r,g,b的值。</param>
        /// <returns>返回TRUE表示成功，返回FALSE表示失败。</returns>
        [DllImport(@"\HK\hikclient.dll")]
        //public static extern bool MP4_ClientSetShowMode(UInt32 dShowType, System.Drawing.Color colorKey);
        public static extern bool MP4_ClientSetShowMode(ulong dShowType, int colorKey);

        /// <summary>
        /// 设置图象质量。
        ///     说明：设置图像质量，当设置成高质量时画面效果好，但CPU利用率高。在支持多路播放时，可以设为
        ///     低质量(LOWQUALITY)，以降低CPU利用率；当某路放大播放时将该路设置成高质量(HIGHQUALITY)，
        ///     以达到好的画面效果。 
        /// 
        /// 24.  BOOL  __stdcall MP4_ClientSetQuality(LONG StockHandle,WORD wPicQuality);
        /// </summary>
        /// <param name="StockHandle">MP4_ClientStart成功返回的值。</param>
        /// <param name="wPicQuality">图象质量。LOWQUALITY表示低图象质量，HIGHQUALITY表示高图象质量。</param>
        /// <returns>返回TRUE表示成功，返回FALSE表示失败。</returns>
        [DllImport(@"\HK\hikclient.dll")]
        public static extern bool MP4_ClientSetQuality(long StockHandle, ushort wPicQuality);

        /// <summary>
        /// 设置抓图回调函数。
        ///     注意要尽快返回，如果要停止回调，可以把回调函数指针CapPicFun设为NULL。一旦设置回调函数，则
        ///     一直有效，直到程序退出。
        /// 
        /// 25.  BOOL __stdcall MP4_ClientSetCapPicCallBack(LONG StockHandle,  void (CALLBACK* CapPicFun)(long StockHandle, char * pBuf, long nSize, long nWidth, long nHeight, long nStamp, long nType, long nReceaved)); 
        /// </summary>
        /// <param name="StockHandle">MP4_ClientStart成功返回的值。</param>
        /// <param name="x"></param>
        /// <returns>返回TRUE表示成功，返回FALSE表示失败。</returns>
        [DllImport(@"\HK\hikclient.dll")]
        public static extern bool MP4_ClientSetCapPicCallBack(int StockHandle, CapPicFun x);

        /// <summary>
        /// 将抓图得到的图像数据保存成BMP文件。
        ///     保存函数需要占用的较多cpu资源，如果不需要保存图片，则不要调用。
        /// 
        /// 26．BOOL __stdcall  MP4_ClientSavePicFile(char * pBuf,long nSize,long nWidth,long nHeight,long nType,char *sFileName); 
        /// </summary>
        /// <param name="pBuf">返回图像数据</param>
        /// <param name="nSize">返回图像数据大小</param>
        /// <param name="nWidth">画面宽，单位像素</param>
        /// <param name="nHeight">画面高</param>
        /// <param name="nType">数据类型， T_RGB32，T_UYVY详见宏定义说明。</param>
        /// <param name="sFileName">要保存的文件名</param>
        /// <returns>返回TRUE表示成功，返回FALSE表示失败。</returns>
        [DllImport(@"\HK\hikclient.dll")]
        public static extern bool MP4_ClientSavePicFile(IntPtr pBuf, int nSize, int nWidth, int nHeight, int nType, string sFileName);


        /// <summary>
        /// 设置解码时丢弃B帧的个数。
        ///     说明： 丢弃的B帧个数越多，CPU利用率越低，动画感越明显。
        /// 
        /// 27．BOOL  __stdcall MP4_ClientThrowBFrame(LONG StockHandle,DWORD dNum);
        /// </summary>
        /// <param name="StockHandle">MP4_ClientStart成功返回的值。 </param>
        /// <param name="dNum">丢弃的帧个数。(0,1,2)</param>
        /// <returns>返回TRUE表示成功，返回FALSE表示失败。 </returns>
        [DllImport(@"\HK\hikclient.dll")]
        public static extern bool MP4_ClientThrowBFrame(long StockHandle, ulong dNum);

        /// <summary>
        /// 获取已经解码的总帧数。 
        /// 
        /// 28． DWORD  __stdcall MP4_ClientGetFrameNum(LONG StockHandle); 
        /// </summary>
        /// <param name="StockHandle">MP4_ClientStart成功返回的值。</param>
        /// <returns>返回帧数值。</returns>
        [DllImport(@"\HK\hikclient.dll")]
        public static extern ulong MP4_ClientGetFrameNum(int StockHandle);

        /// <summary>
        /// 获取版本号。
        /// 
        /// 29．DWORD  __stdcall  MP4_ClientGetSdkVersion() 
        /// </summary>
        /// <returns></returns>
        [DllImport(@"\HK\hikclient.dll")]
        public static extern uint MP4_ClientGetSdkVersion();

        /// <summary>
        /// 30.设置播放声音的模式。
        ///     1> SINGLEAUDIO模式下只能调用 MP4_ClientAudioStart和MP4_ClientAudioStop。 
        ///     2> MULTIAUDIO模式下只能调用 MP4_ClientAudioStartShare和MP4_ClientAudioStopShare。 
        ///     3>两种模式下都可以调用MP4_ClientAudioVolume。 
        ///     4>在客户端软件运行过程中，用户可以在关闭所有播放器的声音之后，可以调用该函数修改播放模式。但
        ///     是建议用户最好在客户端软件初始化的时候设置一次播放模式，之后不再修改。 
        /// 
        /// 30．BOOL  __stdcall MP4_ClientAudioMode(WORD wMode) 
        /// </summary>
        /// <param name="wMode">有两个选项。默认使用SINGLEAUDIO。
        /// SINGLEAUDIO：开发包原来的模式。在一个客户端软件中，同时最多只有一个播放器可以播放声音；
        /// MULTIAUDIO：新增加的模式。在一个客户端软件中，同时可以有多个播放器播放声音。 
        /// </param>
        /// <returns></returns>
        [DllImport(@"\HK\hikclient.dll")]
        public static extern bool MP4_ClientAudioMode(ushort wMode);

        /// <summary>
        /// 开始播放某一路声音。MULTIAUDIO模式下使用。
        /// 
        /// 31． BOOL  __stdcall MP4_ClientAudioStartShare(LONG StockHandle)
        /// </summary>
        /// <param name="StockHandle">MP4_ClientStart成功返回的值。</param>
        /// <returns>返回TRUE表示成功，返回FALSE表示失败。</returns>
        [DllImport(@"\HK\hikclient.dll")]
        public static extern bool MP4_ClientAudioStartShare(long StockHandle);

        /// <summary>
        /// 停止播放声音。MULTIAUDIO模式下使用。
        /// 
        /// 32． BOOL  __stdcall MP4_ClientAudioStopShare(LONG StockHandle) 
        /// </summary>
        /// <param name="StockHandle">MP4_ClientStart成功返回的值。</param>
        /// <returns>返回TRUE表示成功，返回FALSE表示失败。</returns>
        [DllImport(@"\HK\hikclient.dll")]
        public static extern bool MP4_ClientAudioStopShare(long StockHandle);

        /// <summary>
        /// 设置多播组地址和网络端口号。 
        /// 说明： 
        ///     1>目前的多播组采用了两种方式：一是开发包内部分配，用户不需要考虑多播组参数细节，默认采用这种
        ///     方式；另一种是调用MP4_ClientCastGroup设置多播组参数。 
        ///     2>该函数在MP4_ClientStart或MP4_ClientStart_Card之后调用。 
        ///     3>每个多播组会占用wPort开始的4个端口。 
        /// 
        /// 33．BOOL  __stdcall MP4_ClientCastGroup(LONG StockHandle,char *sIP,WORD wPort)
        /// </summary>
        /// <param name="StockHandle">MP4_ClientStart成功返回的值。</param>
        /// <param name="sIP">多播组地址。</param>
        /// <param name="wPort">多播组网络端口号。 </param>
        /// <returns></returns>
        [DllImport(@"\HK\hikclient.dll")]
        public static extern bool MP4_ClientCastGroup(long StockHandle, out string sIP, ushort wPort);

        /// <summary>
        /// 设置叠加字幕的回调函数。
        /// 
        /// 34． BOOL  __stdcall  MP4_ClientRigisterDrawFun(LONG StockHandle, void (CALLBACK* DrawFun)(LONG StockHandle,HDC hDc,LONG nUser),LONG nUser)．
        /// </summary>
        /// <param name="StockHandle">MP4_ClientStart成功返回的值。</param>
        /// <param name="x">DC句柄。</param>
        /// <param name="nUser">保留。设置成NULL。</param>
        /// <returns></returns>
        [DllImport(@"\HK\hikclient.dll")]
        public static extern bool MP4_ClientRigisterDrawFun(long StockHandle, DrawFun x, long nUser);

        /// <summary>
        /// 清除数据缓冲区。包括客户端和服务端
        /// 
        /// 35．BOOL __stdcall MP4_ClientCleanBuffer(LONG nPort,int nCleanType)
        /// </summary>
        /// <param name="nPort">MP4_ClientStart的返回值。 </param>
        /// <param name="nCleanType">
        /// 清除类型。 nCleanType为0只清除客户端缓冲区，nCleanType为1只清除服务端缓冲区，
        /// nCleanType为2清除客户端/服务端缓冲区。 
        /// </param>
        /// <returns>返回TRUE表示成功，返回FALSE表示失败。</returns>
        [DllImport(@"\HK\hikclient.dll")]
        public static extern bool MP4_ClientCleanBuffer(long nPort, int nCleanType);

        /// <summary>
        /// 设置视频参数。
        /// 
        /// 36．BOOL  MP4_ClientSetVideoPara(LONG StockHandle,DWORD nRegionNum, int nBrightness, int nContrast, int nSaturation, int nHue) 
        /// </summary>
        /// <param name="StockHandle">MP4_ClientStart成功返回的值。</param>
        /// <param name="nRegionNum">暂时不用，设置成0。</param>
        /// <param name="nBrightness">亮度，默认64； 范围0-128；</param>
        /// <param name="nContrast">对比度，默认64； 范围0-128；</param>
        /// <param name="nSaturation">饱和度，默认64； 范围0-128；</param>
        /// <param name="nHue">色调，默认64； 范围0-128；</param>
        /// <returns>返回TRUE表示成功，返回FALSE表示失败。 </returns>
        [DllImport(@"\HK\hikclient.dll")]
        public static extern bool MP4_ClientSetVideoPara(long StockHandle, ulong nRegionNum, int nBrightness, int nContrast, int nSaturation, int nHue);

        /// <summary>
        /// 获取视频参数。
        /// 
        /// 37．BOOL  MP4_ClientGetVideoPara(LONG StockHandle,DWORD nRegionNum, int *pBrightness, int *pContrast, int *pSaturation, int *pHue) 
        /// </summary>
        /// <param name="StockHandle">MP4_ClientStart成功返回的值。</param>
        /// <param name="nRegionNum">暂时不用，设置成0。 </param>
        /// <param name="pBrightness">亮度，默认64； 范围0-128；</param>
        /// <param name="pContrast">对比度，默认64； 范围0-128；</param>
        /// <param name="pSaturation">饱和度，默认64； 范围0-128；</param>
        /// <param name="pHue">色调，默认64； 范围0-128；</param>
        /// <returns>返回TRUE表示成功，返回FALSE表示失败。</returns>
        [DllImport(@"\HK\hikclient.dll")]
        public static extern bool MP4_ClientGetVideoPara(long StockHandle, ulong nRegionNum, out int pBrightness, out int pContrast, out int pSaturation, out int pHue);

        #endregion
    }
        
        #endregion
}
/*
 * 修改记录

          1.     2009-2-27，截图函数有问题

               1.1     委托CapPicFun的参数pBuf数据类型改为IntPtr

                    改前代码：public delegate void CapPicFun(int StockHandle, [MarshalAs(UnmanagedType.LPArray, SizeConst = 152064)] byte[] pBuf, int nSize, int nWidth, int nHeight, int nStamp, int nType, int nReceaved);

                    改后代码：public delegate void CapPicFun(int StockHandle, IntPtr pBuf, int nSize, int nWidth, int nHeight, int nStamp, int nType, int nReceaved);

               1.2     截图函数参数

                    改前代码：public static extern bool MP4_ClientSavePicFile([MarshalAs(UnmanagedType.LPArray)] byte[] pBuf, int nSize, int nWidth, int nHeight, int nType, 

string sFileName);

                    改后代码：public static extern bool MP4_ClientSavePicFile(IntPtr pBuf, int nSize, int nWidth, int nHeight, int nType, string sFileName);

          2.     2009-3-4，客户端的数据捕获(录像)

               2.1     开始录像

                    改前代码：public static extern bool MP4_ClientStartCaptureFile(long StockHandle, string FileName);

                    改后代码：public static extern bool MP4_ClientStartCaptureFile(int StockHandle, string FileName);

               2.2     停止录像
                    改前代码：public static extern bool MP4_ClientStopCapture(long StockHandle);

                    改后代码：public static extern bool MP4_ClientStopCapture(int StockHandle);
 * http://www.cnblogs.com/over140/archive/2009/02/15/1390890.html
 */
